<?php

App::uses('AppController', 'Controller');

/**
 * Maneja la información de los usuarios
 * 
 * @author vcanizares
 */
class FicheroController extends AppController {
	
	/**
	 * Constantes
	 */
	const ANCHO_IMAGEN_PREDETERMINADO = 1024;
	
	
	/**
	 * Componentes
	 */
	//public $components = array('RequestHandler');
	
	/**
	 * Helpers
	 */
	//public $helpers = array('Js');
	
	/**
	 * Nombre del controlador
	 */
	public $name = 'Fichero';
	
	/**
	 * Modelos
	 */
	public $uses = array('Fichero', 'Cita', 'Usuario');
	
	
	public function index(){}
	
	public function nuevo(){}
	
	/**
	 * Añade una imagen a la aplicación
	 */
	public function subir_imagen(){
		
		if ($this->request->is('post')) {
			
			// Comprobamos si la imagen se ha enviado correctamente por POST 
			if ($_FILES["imageFile"]["error"] > 0) {
				$this->Session->setFlash("Se ha producido un error al subir la imagen. Código de error: " . $_FILES["imageFile"]["error"] . "<br>");
				return false;
			}
			else {
				
				// Extension de la imagen subida
				$imageExtension = explode(".", $_FILES["imageFile"]["name"]);
				$imageExtension = end($imageExtension);
				$imageExtension = strtolower($imageExtension);
				
				// Datos del usuario
				$usuario_id = 1; // TODO Obtener el id a partir del usuario en sesión
				
				// Datos de la cita
				$cita_id = 1; // TODO Obtener el id real
				
				// Nombre de la imagen
				$nombre_fisico = time()."_".$cita_id.".".$imageExtension;
				
				// Ruta donde se ubicará la imagen
				$imageAbsolutePath = IMAGES.'users/'.$usuario_id."/";
				$imageRelativePath = APP_DIR.'/'.WEBROOT_DIR.'/'.IMAGES_URL.'users/'.$usuario_id."/";
				
				// Si no existe el directorio, lo creamos
				if(!file_exists($imageAbsolutePath)) {
					mkdir($imageAbsolutePath, 0774);
				}
				
				// Validamos la imagen
				if($this->validar_imagen($nombre_fisico, $imageExtension, $imageAbsolutePath)) {
					
					// Inicializamos el modelo
			       	$this->Fichero->create();
			       
			       	// Seteamos los datos recibidos
			       	$this->Fichero->data['Fichero']['nombreFisico']=$nombre_fisico;
			       	$this->Fichero->data['Fichero']['nombre']=$this->request->data['imageName'];;
			       	$this->Fichero->data['Fichero']['descripcion']=$this->request->data['imageDescription'];
			       	$this->Fichero->data['Fichero']['fechaAlta']= date("Y-m-d H:i:s");
			       	$this->Fichero->data['Fichero']['cita_id']=$cita_id;
			       	$this->Fichero->data['Fichero']['tipoMime']=$_FILES["imageFile"]["type"];
			       	$this->Fichero->data['Fichero']['ruta']=$imageRelativePath;
			       	$this->Fichero->data['Fichero']['indImagenPortada']=1;
			       	
			       	try {
				       	// Creamos el nuevo registro en BD
						if ($this->Fichero->save($this->Fichero->data['Fichero'])) {
							$this->Session->setFlash(__('La imagen se ha subido correctamente'));
						}
						else {
							// Escribimos los errores de validacion
			       			$this->log($this->Fichero->invalidFields());
							throw new exception;
						}
			       	}
			       	catch (exception $e) {
			       		
			       		// Eliminamos el fichero generado
			       		if(file_exists($imageAbsolutePath.$nombre_fisico)) {
			       			unlink($imageAbsolutePath.$nombre_fisico);
			       		}
			       		
			       		// Escribimos el error en el log
			       		$this->log("File: ".$e->getFile()." Message: ".$e->getMessage()." Code: ".$e->getLine());
			       		
			       		// Mostramos un mensaje informativo al usuario
			       		$this->Session->setFlash(__('Ocurrió un error durante el procesamiento de la imagen. Por favor, inténtelo más tarde.'));
			       	}
				}
			}
		}
	}
	
	/**
	 * Valida que la imagen tenga un formato y extension permitidos y redimensaiona la imagen si es necesario
	 * 
	 * @param string $imageName
	 * @param string $imageExtension
	 * @param string $imageAbsolutePath
	 * @return boolean
	 */
	private function validar_imagen($imageName, $imageExtension, $imageAbsolutePath) {

		// Comprobamos si el tipo mime y la extensión están dentro de los permitidos
		if (in_array($_FILES["imageFile"]["type"], FicheroController::obtener_tipos_mime_imagen_permitidos())
		&& in_array($imageExtension, FicheroController::obtener_extensiones_imagen_permitidas()))
		{
			// Movemos la imagen a la ruta indicada por parametro
			if(move_uploaded_file($_FILES["imageFile"]["tmp_name"], $imageAbsolutePath.$imageName)) {
				
				// Redimensionamos la imagen al tamaño predeterminado
				if(!$this->redimensionar_imagen($imageAbsolutePath.$imageName)) {
					return false;
				}
			}
			else {
				$this->Session->setFlash(__("Error procesando la imagen, por favor, vuelva a intentarlo. <br> Si el problema persiste, contacte con el administrador de la aplicación"));
				return false;
			}
		}
		else
		{
			$this->Session->setFlash(__("Formato o extensión de imagen no válido. Debe seleccionar una imagen con formato .gif, .jpeg, .jpg o .png"));
			return false;
		}
		
		return true;
	}
	
	/**
	 * Redimensiona una imagen según el ancho indicado por parametro
	 *  
	 * @param string $nombre, nombre y ruta completos de la imagen
	 */
	private function redimensionar_imagen($nombre){
		
		$img_origen;

		// GIF
		if($_FILES["imageFile"]["type"] == "image/gif") {
			$img_origen = imagecreatefromgif( $nombre );
		}
		// JPG
		else if ($_FILES["imageFile"]["type"] == "image/jpeg" || $_FILES["imageFile"]["type"] == "image/jpg" || $_FILES["imageFile"]["type"] == "image/pjpeg") {
			$img_origen = imagecreatefromjpeg( $nombre );
		}
		// PNG
		else if($_FILES["imageFile"]["type"] == "image/x-png" || $_FILES["imageFile"]["type"] == "image/png") {
			$img_origen = imagecreatefrompng( $nombre );
		}
		
		// Obtenemos el ancho y alto de la imagen
		$ancho_origen = imagesx( $img_origen );
		$alto_origen = imagesy( $img_origen );
		
		/*
		 * Seteamos las proporciones
		 */
		{
			// Imagen horizontal
			if($ancho_origen > $alto_origen && $ancho_origen > FicheroController::ANCHO_IMAGEN_PREDETERMINADO){
				$ancho_origen = FicheroController::ANCHO_IMAGEN_PREDETERMINADO;
				$alto_origen = FicheroController::ANCHO_IMAGEN_PREDETERMINADO * imagesy( $img_origen ) / imagesx( $img_origen );
			}
			// Imagen vertical
			elseif($alto_origen > $ancho_origen && $alto_origen > FicheroController::ANCHO_IMAGEN_PREDETERMINADO) {
				$alto_origen = FicheroController::ANCHO_IMAGEN_PREDETERMINADO;
				$ancho_origen = FicheroController::ANCHO_IMAGEN_PREDETERMINADO * imagesx( $img_origen ) / imagesy( $img_origen );
			}
			// No es necesaria la redimension
			else {
				return true;
			}
		}
		
		// Creamos el marco donde irá contenida la nueva imagen segun las dimensiones calculadas
		$img_destino = imagecreatetruecolor($ancho_origen ,$alto_origen );
		
		// Redimensionamos la imagen
		imagecopyresized( $img_destino, $img_origen, 0, 0, 0, 0, $ancho_origen, $alto_origen, imagesx( $img_origen ), imagesy( $img_origen ) );
		
		// Generamos la nueva imagen redimensionada
		if($_FILES["imageFile"]["type"] == "image/gif") {
			imagegif( $img_destino, $nombre );
		}
		else if ($_FILES["imageFile"]["type"] == "image/jpeg" || $_FILES["imageFile"]["type"] == "image/jpg" || $_FILES["imageFile"]["type"] == "image/pjpeg") {
			imagejpeg( $img_destino, $nombre );
		}
		else if($_FILES["imageFile"]["type"] == "image/x-png" || $_FILES["imageFile"]["type"] == "image/png") {
			imagepng( $img_destino, $nombre );
		}
		
		return true;
	}
	
	/**
	 * Devuelve las extensiones permitidas para imágenes
	 */
	private function obtener_extensiones_imagen_permitidas() {
		return array("gif", "jpeg", "jpg", "png");
	}
	
	/**
	 * Devuelve los tipos MIME permitidos para imagenes
	 */
	private function obtener_tipos_mime_imagen_permitidos() {
		return array("image/gif", "image/jpeg", "image/jpg", "image/pjpeg", "image/x-png", "image/png");
	}

}

?>